﻿// CSendOrPost.cpp: 实现文件
//

#include "pch.h"
#include "CClient.h"
#include "CSendOrPost.h"
#include "afxdialogex.h"



// CSendOrPost 对话框
/*
系统消息 0-1023
用户消息 1024-32767
类向导中添加自定义消息
*/
int UM_LBDOWN = WM_USER + 1;
int UM_LBUP = WM_USER + 2;

IMPLEMENT_DYNAMIC(CSendOrPost, CDialogEx)

CSendOrPost::CSendOrPost(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SEND_POST, pParent)
{

}

CSendOrPost::~CSendOrPost()
{
}

void CSendOrPost::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CSendOrPost, CDialogEx)
	ON_BN_CLICKED(IDC_SEND, &CSendOrPost::OnClickedSend)
	ON_BN_CLICKED(IDC_POST, &CSendOrPost::OnClickedPost)
	ON_MESSAGE(UM_LBDOWN, &CSendOrPost::OnUmLbdown)
	ON_MESSAGE(UM_LBUP, &CSendOrPost::OnUmLbup)
END_MESSAGE_MAP()


// CSendOrPost 消息处理程序
/*
WM_SYSCOMMAND 系统菜单和系统按钮消息
*/

void CSendOrPost::OnClickedSend()
{
	CWnd* p = FindWindow(_T("NotePad"), NULL);
	if (p) {
		// 关闭
		// p->SendMessage(WM_CLOSE);
		// 最大化
		// p->SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE);
		// 最小化
		p->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
	}
	// 自定义消息
	p = GetDlgItem(IDC_SEND);
	p = p->GetParent();
	if (p) {
		p->SendMessage(UM_LBDOWN);
	}
}

//// typedef UINT (AFX_CDECL *AFX_THREADPROC)(LPVOID);
//// AFX_CDECL  __cdecl  函数调用约定
//// ‌__cdecl‌：调用者负责清理栈，每次函数调用后都需要手动调整栈指针
//‌// __stdcall‌：被调用者负责清理栈，函数返回前会自动调整栈指针‌
//// __cdecl‌：支持可变参数函数，因为调用者负责清理栈‌
//‌// __stdcall‌：不支持可变参数函数，因为被调用者负责清理栈‌
UINT TheProc(LPVOID lp) {
	CSendOrPost* p = (CSendOrPost*)lp;
	p->g_sharedData = 1;
	p->PostMessage(UM_LBDOWN, 11, 12);
	return 0;
}

void CSendOrPost::OnClickedPost()
{
	CWnd* p = FindWindow(_T("NotePad"), NULL);
	if (p) {
		// 最小化
		// p->PostMessage(WM_SYSCOMMAND, SC_MINIMIZE);
		// WM_SYSCOMMAND 系统菜单消息
		p->PostMessage(WM_SYSCOMMAND, SC_CLOSE);
	}
	// 自定义消息
	p = GetDlgItem(IDC_SEND);
	p = p->GetParent();
	if (p) {
		p->SendMessage(UM_LBUP);
	}
}


afx_msg LRESULT CSendOrPost::OnUmLbdown(WPARAM wParam, LPARAM lParam)
{
	TRACE(_T("OnUmLbdown %d, %d\n"), wParam, lParam);
	return 0;
}


afx_msg LRESULT CSendOrPost::OnUmLbup(WPARAM wParam, LPARAM lParam)
{
	TRACE(_T("OnUmLbup\n"));
	return 0;
}


BOOL CSendOrPost::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	AfxBeginThread(TheProc, this);

	return TRUE;
}


/*
// 共享数据
int data[1024];
std::atomic<bool> ready(false);

// 生产者线程
void producer() {
	// 写入数据
	for(int i=0; i<1024; ++i) data[i] = i;  // (1) 非原子操作

	std::atomic_thread_fence(std::memory_order_release); // 释放栅栏
	ready.store(true, std::memory_order_relaxed);        // (2)
}

// 消费者线程
void consumer() {
	while(!ready.load(std::memory_order_relaxed));       // (3)

	std::atomic_thread_fence(std::memory_order_acquire); // 获取栅栏
	// 读取数据
	for(int i=0; i<1024; ++i) std::cout << data[i];      // (4)
}
*/